/* -------------------------------------------------------------------------
 *
 * ip.h
 *	  Definitions for IPv6-aware network access.
 *
 * These definitions are used by both frontend and backend code.  Be careful
 * what you include here!
 *
 * Copyright (c) 2003-2012, PostgreSQL Global Development Group
 *
 * src/include/libpq/ip.h
 *
 * -------------------------------------------------------------------------
 */
#ifndef IP_H
#define IP_H

#include "getaddrinfo.h"  /* pgrminclude ignore */
#include "libpq/pqcomm.h" /* pgrminclude ignore */

#ifdef HAVE_UNIX_SOCKETS
#define IS_AF_UNIX(fam) ((fam) == AF_UNIX)
#else
#define IS_AF_UNIX(fam) (0)
#endif

typedef void (*PgIfAddrCallback)(struct sockaddr* addr, struct sockaddr* netmask, void* cb_data);

extern int pg_getaddrinfo_all(
    const char* hostname, const char* servname, const struct addrinfo* hintp, struct addrinfo** result);
extern void pg_freeaddrinfo_all(int hint_ai_family, struct addrinfo* ai);

extern int pg_getnameinfo_all(
    const struct sockaddr_storage* addr, int salen, char* node, int nodelen, char* service, int servicelen, int flags);

extern int pg_range_sockaddr(const struct sockaddr_storage* addr, const struct sockaddr_storage* netaddr,
    const struct sockaddr_storage* netmask);

extern int pg_sockaddr_cidr_mask(struct sockaddr_storage* mask, const char* numbits, int family);

extern int resolveHostname2Ip(int netType, char* hostname, char* ip);
extern int resolveHostIp2Name(int netType, char* ip, char* hostname);

#ifdef HAVE_IPV6
extern void pg_promote_v4_to_v6_addr(struct sockaddr_storage* addr);
extern void pg_promote_v4_to_v6_mask(struct sockaddr_storage* addr);
#endif

extern int pg_foreach_ifaddr(PgIfAddrCallback callback, void* cb_data);

#endif /* IP_H */
